'use client';

import React from 'react';
import { useSetAtom } from 'jotai';
import { usePathname, useRouter } from 'next/navigation';
import { getUser } from 'src/actions/user';
import { User, userAtom } from 'src/model';
import { protectedRoutesRegExps } from 'src/lib/authPatterns';
import { useRequest } from 'ahooks';
import { isEqual } from 'lodash-es';

export interface SyncUserAtomProps {
  initialValue?: User;
}

/**
 *  实时更新 userAtom：每次路由变化时，都会重新获取用户信息（保持实时性），如果信息不变，则不更新（保持不变性），减少 react 渲染次数
 */
function SyncUserAtomNoMemoized(props: SyncUserAtomProps) {
  const { initialValue } = props;

  const pathname = usePathname();
  const router = useRouter();

  const setUser = useSetAtom(userAtom);

  useRequest(getUser, {
    debounceWait: 300,
    refreshDeps: [pathname],
    onFinally(params, data, e) {
      const isError = e || !data;

      // --- 未正常登录 ---
      if (isError) {
        // 清除全局状态管理中的用户信息
        if (initialValue !== undefined) {
          setUser(undefined);
        }
        // 如果是受保护路由，跳转到登录页
        const isProtectedRoute = protectedRoutesRegExps.some((pattern) => pattern.test(pathname));
        if (isProtectedRoute) {
          const searchParams = new URLSearchParams();
          searchParams.set('redirect', pathname);
          router.replace(`/login?${searchParams.toString()}`);
        }
        return;
      }

      // --- 已正常登录 ---
      // 将用户信息存储/更新到全局状态管理中
      const newState = {
        id: data.id,
        name: data.name,
        email: data.email,
        avatar: data.avatar || '',
        phone: data.phone || '',
        bio: data.bio || '',
        role: data.role,
        isActive: data.isActive,
        isVerified: data.isVerified,
      };
      if (!isEqual(initialValue, newState)) {
        // 如果用户信息发生变化，更新全局状态管理中的用户信息
        setUser(newState);
      }
    },
  });

  return null;
}

/**
 *  由于 userAtom 数据对实时性要求较高，每次路由变化时，实时更新 userAtom，已验证真实登录状态
 */
export const SyncUserAtom = React.memo(SyncUserAtomNoMemoized);
